﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Xml;
using IntraVision.Web.Toolkit;

namespace IntraVision.Web
{
    public enum SortDirection { None, Ascending, Descending, Disabled };

    public class Column
    {
        /// <summary>
        /// Кодовое имя колонки
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// Краткое имя колонки, оно будет выведено в заголовке
        /// </summary>
        public string ShortTitle { get; set; }

        /// <summary>
        /// Полное имя колонки, оно будет выведено 
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// Формат ячейки, включает в себя макроподстановки вида {@Name}, которые будут скопированы из соответствующих полей объекта.
        /// </summary>
        public string Format { get; set; }

        /// <summary>
        /// Формат ячейки, использующийся для экспорта Excel
        /// </summary>
        public string ExcelFormat { get; set; }

        /// <summary>
        /// Префикс для идентификатора ячейки. Если он задан, ячейке таблицы будет присвоен Id вида "name25", где name - TdId.
        /// </summary>
        public string TdId { get; set; }

        /// <summary>
        /// Ширина колонки, в процентах
        /// </summary>
        public int Width { get; set; }

        /// <summary>
        /// Класс ячейки
        /// </summary>
        public string CssClass { get; set; }

        /// <summary>
        /// Разрешена ли сортировка по этому полю
        /// </summary>
        public bool Sortable { get { return !String.IsNullOrEmpty(SortAlias); } }

        /// <summary>
        /// Определяет, какую колонку использовать при сортировке
        /// </summary>
        public string SortAlias {get; set; }

        /// <summary>
        /// Направление сортировки
        /// </summary>
        public SortDirection SortDirection { get; set; }

        /// <summary>
        /// Направление сортировки по умолчанию
        /// </summary>
        public SortDirection DefaultSortDirection { get; set; }

        /// <summary>
        /// Показывать колонку или нет
        /// </summary>
        public bool Visible { get; set; }

        private bool _IsSystem;
        /// <summary>
        /// Системная. Не может быть показана, только для хранения данных.
        /// </summary>
        public bool IsSystem
        {
            get { return _IsSystem; }
            set
            {
                if (value) Visible = false;
                _IsSystem = value;
            }
        }

        /// <summary>
        /// Подсчитывать итого или нет
        /// </summary>
        public bool CountTotal { get; set; }

        /// <summary>
        /// Порядок колонки при выводе
        /// </summary>
        public int Order { get; set; }

        /// <summary>
        /// Порядок колонки при сортировке
        /// </summary>
        public int SortOrder { get; set; }

        /// <summary>
        /// Выражение для сортировки - SortAlias + SortDirection.
        /// </summary>
        public string SortExpression
        {
            get
            {
                if (!Sortable) return "";
                string direction = (SortDirection == SortDirection.Ascending) ? "desc" : "asc";
                return string.Format(CultureInfo.InvariantCulture, "{0} {1}", SortAlias, direction);
            }
        }

        public Column() {
            Visible = true;
            Order = int.MaxValue;
            SortOrder = int.MaxValue;
        }

        public Column(string alias, string title, string format, int width) : this()
        {
            Id = alias;
            Title = title;
            ShortTitle = title;
            Format = format;
            SortAlias = alias;
            Visible = true;
            Width = width;
        }

        public Column(string alias, string title, int width)
            : this(alias, title, "{@"+alias+"}", width)
        {
        }

        public void InitFromXml(XmlElement xe)
        {
            if (xe.HasAttribute("id")) Id = xe.GetAttribute("id");
            string shortTitle = xe.GetAttribute("short-title");
            string title = xe.GetAttribute("title");
            if (xe.HasAttribute("short-title")) ShortTitle = shortTitle.StartsWith("#") ? HTMLHelper.Resource(shortTitle.TrimStart('#')) : shortTitle;
            if (xe.HasAttribute("title")) Title = title.StartsWith("#") ? HTMLHelper.Resource(title.TrimStart('#')) : title;
            if (xe.HasAttribute("td-id")) TdId = xe.GetAttribute("td-id");
            if (xe.HasAttribute("width")) Width = Convert.ToInt32(xe.GetAttribute("width"), CultureInfo.InvariantCulture);
            if (xe.HasAttribute("sort-alias")) SortAlias = xe.GetAttribute("sort-alias");
            if (xe.HasAttribute("css-class")) CssClass = xe.GetAttribute("css-class");
            if (xe.HasAttribute("total")) CountTotal = true;
            if (xe.HasAttribute("hidden")) Visible = false;
            if (xe.HasAttribute("system")) IsSystem = true;

            if (xe.SelectSingleNode("format") != null) Format = xe.SelectSingleNode("format").InnerText;
            if (xe.SelectSingleNode("excel-format") != null) ExcelFormat = xe.SelectSingleNode("excel-format").InnerText;

            if (!string.IsNullOrEmpty(Title) && string.IsNullOrEmpty(ShortTitle)) ShortTitle = Title;
        }
    }
}
